#ifndef __CHESSBOARD_H__
#define __CHESSBOARD_H__

#include <QMainWindow>

#include "ChessMan.h"

typedef enum{
    NO_CLICK,   // 没有点击
    FIRST_CLICK, // 第一次点击
    SECOND_CLICK // 第二次点击
}ClickedState_e;




class ChessBoard : public QMainWindow
{
private:

    QPoint _origin; // 棋盘左上角坐标
    int _gridSize; // 格子尺寸
    int _chessManR; // 棋子半径
    ChessMan _chessMan[32]; // 32个棋子
    int _chessManIndex; // 棋子索引

    ChessCamp_e _playerCamp; // 玩家阵营
    ChessCamp_e _currentCamp; // 当前阵营
    ClickedState_e _clickedState; // 点击状态
    int _firstClickChessId; // 第一次选中棋子的ID

public:
    explicit ChessBoard(QWidget *parent = nullptr);
    virtual ~ChessBoard() = default;

    void chessBoardInit(void); // 棋盘初始化

    virtual void paintEvent(QPaintEvent *); // 绘画事件
    virtual void mousePressEvent(QMouseEvent *); // 鼠标点击事件
    virtual void mouseReleaseEvent(QMouseEvent *); // 鼠标释放事件

    void chessManInit(void); // 棋子初始化
    void addChessMan(ChessCamp_e ,ChessType_e ,int row, int col); // 新增棋子
    void drawChessMan(QPainter &, int id); // 绘制棋子
    
    bool getClickedChessMan(QPoint,int &id); // 获取点中的棋子

    // 判断坐标内是否有子
    bool judgeChessManInPos(int row,int col); 
    // 判断输赢
    bool judgeWin(void);

    bool canMove(int moveId,int row,int col, int killId); // 获取目标点是否可走
    // 走棋和吃子规则
    bool canMoveJiang(int moveId,int row,int col, int killId);  // 将 
    bool canMoveShi(int moveId,int row,int col, int killId);    // 士 
    bool canMoveXiang(int moveId,int row,int col, int killId);  // 相
    bool canMoveMa(int moveId,int row,int col, int killId);     // 马 
    bool canMoveChe(int moveId,int row,int col, int killId);    // 车 
    bool canMovePao(int moveId,int row,int col, int killId);    // 炮 
    bool canMoveBing(int moveId,int row,int col, int killId);   // 兵 
    // 切换阵营
    void switchcurrentCamp(void)
    {
        if(_currentCamp == CAMP_RED)
            _currentCamp = CAMP_BLACK;
        else 
            _currentCamp = CAMP_RED;
    }

    // 获取绝对坐标
    QPoint center(int row,int col);
    QPoint center(int id);
    // 由绝对坐标获取棋盘内坐标
    bool getChessBoardPos(QPoint,int &row,int &col);



};





#endif
